#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

class QFrame;
class QLabel;
class QLineEdit;
class QPushButton;
class QJsonObject;
class QNetworkRequest;
class QSqlQuery;
class QCompleter;
//class QStringList;
class QStringListModel;
class HttpRequest;

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT
public:


private:
    QString m_username;
    QString m_password;

    HttpRequest *m_http;

    // 用户登录信息，用来存储登录成功的用户，通过信号槽发送给主窗口
    QStringList loginUserInfo;

    // 用来存储从服务器获取到的数据
    QHash<QString, QString> HttpGetData;

    // 添加邮箱后缀提示
    QCompleter *m_completer_email;  // 下来提示框
    QStringList m_emailSuffixes;    // 常用的邮箱后缀
    QStringListModel *m_model_email;// list模型

    // 用户信息
    int m_code;
    QString m_randCodeStr;
    QString m_message;
    QStringList m_login_user_list;

    QJsonObject *m_JsonObject;

    QSqlQuery *login_query;

    // 鼠标事件
    QRect m_areaMovable;//可移动窗口的区域，鼠标只有在该区域按下才能移动窗口
    bool m_bPressed;//鼠标按下标志（不分左右键）
    QPoint m_ptPress;//鼠标按下的初始位置

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

    // 初始化配置
    void widget_frame_Init();

    void login_Init();

    void sigenup_Init();

    void email_Init();

    void email_lienEdit_Completer();


    //设置鼠标按下可移动窗口的区域，在子窗口中必须设置该区域
    void setAreaMovable(const QRect rt);

    // GET获取数据
    int NormalGetRequest(QString path, QString username, QString password);

    // HTTP上传数据
    int NormalPostRequest(QString path, QString username, QString password);
    int NormalPostRequest(QString path, QString username, QString password, QString email, QString home);

    // 生成GET请求
    QNetworkRequest setGetRequest(QString paramer1, QString paramer2,QString path,QString scheme, QString serverAddr, QString port);


    // 解析JSON
    int getJsonDatas(QJsonObject obj);

    // 密码确认比对
    void info_check(QString operate, QLineEdit *lineEdit_user, QLineEdit *lineEdit_pwd,
                       QLabel *label_user_hint, QLabel *label_pwd_hint);


    // 导入所有用户到提示框
    void getAllUsers();

    // 检查邮箱的格式
    bool CheckEmailFormat(QString email);

//    // 获取登录用户信息
//    QMap<QString, QString> get_user_info();

    QStringList getLoginUserInfo() const;
    void setLoginUserInfo(const QStringList &value);

protected:
    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
private slots:

    void on_pushButton_login_sigenup_clicked();

    void on_pushButton_login_enter_clicked();

    void on_pushButton_sigenup_clicked();

    void on_pushButton_email_clicked();

    void on_pushButton_email_enter_clicked();

    // 跳转邮箱界面
    void do_Label_longin_forget_clicked();

    // 发送结果
    void do_sendResult(int status);

    // 邮箱后缀
    void do_mailbox_suffix(const QString &text);

    // 邮箱验证登录
    void do_email_login_user_info(QString name, QString pwd);

    void closeEvent(QCloseEvent *event);
signals:
    void forget_clicked();

    void email_login_user_info(QString name, QString pwd);

    void user_info(QString name);

    void loginWindowClosed();

//    void loginUserInfo(const QMap &user_info);

//    void sigenup_goto();
//    void email_enter_clicked(QJsonObject Obj);

private:
    Ui::Dialog *ui;
};
#endif // DIALOG_H
